/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package data;
import java.util.*;
import java.sql.*;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import data.categoria;
import user.UserData;
/**
 *
 * @author a72278
 */
public class proyectoMapper {
    Connection conexion;
    ResultSet resultSet;   
    String url = "jdbc:mysql://localhost/test";
    String dbName = "mysql";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "root";
    String password = "root";
       
    public proyectoMapper(){
        conexion = null;
        try{
        java.sql.Driver mySQLDriver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
        DriverManager.registerDriver(mySQLDriver);
        }catch(Exception e){
        }
    }
    
    public int autentificar(String usr, String pass){
        int tipo;
        try{
            conexion = DriverManager.getConnection(url, userName, password);
            Statement s = conexion.createStatement();
            String query = "Select tipousuario from usuario where nombre = '"+usr+"' AND contraseña = '"+pass+"';";
            s.executeQuery(query);
            ResultSet rs = s.getResultSet();
            rs.next();
            tipo = rs.getInt(1);
        }catch(Exception e){
            String error = e.getMessage();
            tipo = -1;
        }
        return tipo;
    }
    
    public categoria importarDatos(){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeQuery("select id,nombre,descripcion,idpadre from categoria");
            ResultSet rs = s.getResultSet();
            categoria raiz,nueva;
            raiz = new categoria();
            rs.beforeFirst();
            while(rs.next()){
                if(rs.getInt(4) == 0 ){
                    raiz.setId(rs.getInt(1));
                    raiz.setNombre(rs.getString(2));
                    raiz.setDescripcion(rs.getString(3));
                }
            }
            nueva = new categoria();
            rs.beforeFirst();
            while(rs.next()){
                if(rs.getInt(4) != 0){
                    nueva = new categoria(rs.getInt(1),rs.getString(2),rs.getString(3));
                    raiz.buscarCategoria(rs.getInt(4)).anadirCategoria(nueva);
                }
            }
            s.executeQuery("select pr.id,pr.nombre,pr.descripcion,pr.fechainicio,pr.fechafin,pr.idcategoria,"
                            + "us.nombre,us.email,us.telefono "
                            + "from proyecto pr, usuario us "
                            + "where pr.idencargado = us.id");
            rs = s.getResultSet();
            rs.beforeFirst();
            proyecto nuevo;
            while(rs.next()){
                    nuevo = new proyecto(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5));
                    nuevo.setNombreEncargado(rs.getString(7));
                    nuevo.setEmailEncargado(rs.getString(8));
                    nuevo.setTelefonoEncargado(rs.getInt(9));
                    raiz.buscarCategoria(rs.getInt(6)).anadirProyecto(nuevo);
            }
            conexion.close();
            return raiz;
        }catch(SQLException e){
            String error = e.getMessage();
            return null;
        }
        
    }
    
    public categoria insertarCategoria(categoria nuevaCat,categoria padreCat){
        try{
            categoria padre = new categoria();
            padre.copiar(padreCat);
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeUpdate("insert into categoria(nombre,descripcion,idpadre)"
                            + "values('"
                            + nuevaCat.getNombre() + "','"
                            + nuevaCat.getDescripcion() + "','" 
                            + Integer.toString(padre.getId()) + "');");
            Statement s2 = conexion.createStatement();
            s2.executeQuery("select id from categoria where nombre = '"
                            + nuevaCat.getNombre() + "'");
            ResultSet rs = s2.getResultSet();
            rs.next();
            int id = rs.getInt(1);
            categoria nueva = new categoria(id,nuevaCat.getNombre(),nuevaCat.getDescripcion());
            padre.anadirCategoria(nueva);
            return padre;
        }catch(Exception e){
            return null;
        }
    }
        
    public void modificarCategoria(categoria modCat, int idActual){        
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            String query = "UPDATE categoria SET ";
            
            if(modCat.getNombre() != null){
                query+= "nombre='"+modCat.getNombre()+"' ";
                if(modCat.getDescripcion() != null){
                    query += ",descripcion='"+modCat.getDescripcion()+"' ";
                }
            }else if(modCat.getDescripcion() != null){
                query += "descripcion='"+modCat.getDescripcion()+"' ";
            }
            
            query += " where id = "+idActual+";";
            Statement s = conexion.createStatement();
            s.executeUpdate(query);
            conexion.close();
        }catch(Exception e){
        }
    }
    
    public String borrarProyectoNombre(String nombre){
        try{
            conexion = DriverManager.getConnection(url, userName, password);
            Statement s = conexion.createStatement();
            String query = "delete from proyecto where nombre ='"+nombre+"';";
           
            s.executeUpdate(query);
            return "";            
        }catch(Exception e){
            return e.getMessage();
        }
    }   
    
    public int buscarCategoriaNombre(String nom){
        try{
            conexion = DriverManager.getConnection(url, userName, password);
            String query = "Select id from categoria where nombre = '"+nom+"';";
            Statement s = conexion.createStatement();
            s.executeQuery(query);
            ResultSet rs = s.getResultSet();
            rs.next();
            return rs.getInt(1);
                    
        }catch(Exception e){
            return 0;
        }
    }
    
    public void modificarProyecto(proyecto modP, String nom){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            String query = "UPDATE proyecto SET ";
            int cont = 0;
            if(modP.getNombre() != null){
                if(cont != 0){
                    query += ",";
                }
                cont++;
                query += "nombre ='"+modP.getNombre()+"' ";
            }
            if(modP.getDescripcion() != null){
                if(cont != 0){
                    query += ",";
                }
                cont++;
                query += "descripcion='"+modP.getDescripcion()+"' ";
            }
            if(modP.getFechaFinal() != null){
                if(cont != 0){
                    query += ",";
                }
                cont++;
                query += "fechaFin='"+modP.getFechaFinal()+"'";
            }
            if(modP.getFechaInicio() != null){
                if(cont != 0){
                    query += ",";
                }
                cont++;
                query += "fechaInicio='"+modP.getFechaInicio()+"'";
            }
            if(modP.getUnidadAcademica() != null){
                if(cont != 0){
                    query += ",";
                }
                cont++;
                query += "unidadAcademica = '"+modP.getUnidadAcademica()+"'";
            }
            if(cont != 0)
                query += ",";
            query += "idCategoria = "+modP.getPadre().getId();
            /*if(modP.getNombreCategoria() != null){
                if(cont!= 0){
                    query += ",";
                }
                cont++;
                query += "idCategoria = (Select id from categoria where nombre = '"+modP.getNombreCategoria()+"')";
                        
            }*/
            query += " where nombre = '"+nom+"';";            
            Statement s = conexion.createStatement();
            s.executeUpdate(query);
            conexion.close();
        }catch(Exception e){
        }
    }
    
    public String borrarCategoria(int idCat){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeUpdate("delete from categoria where id = "+Integer.toString(idCat)+";");
            conexion.close();
            return "";
        }catch(Exception e){
            return e.getMessage();
        }
    }
    
    public List<proyecto> busquedaProyecto(categoria actual){
        List<proyecto> resultado = new ArrayList();
        String query = "select id from proyecto;";
        categoria raiz = new categoria();
        raiz.copiar(actual);
        while(raiz.getPadre() != null){
            raiz.copiar(raiz.getPadre());
        }
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeQuery(query);
            ResultSet rs = s.getResultSet();
            rs.beforeFirst();
            while(rs.next()){
                resultado.add(raiz.buscarProyecto(rs.getInt(1)));
            }
        }catch(Exception e){
            String error = e.getMessage();
            return null;
        }        
        return resultado;
    }
    
    public List<proyecto> busquedaAvanzada(String texto,categoria actual){
        
        //Obtiene la raiz
        categoria raiz = new categoria();
        raiz.copiar(actual);
        
        while(raiz.getPadre() != null){
            raiz.copiar(raiz.getPadre());
        }
        //Separa la descripcion
        StringTokenizer tokens = new StringTokenizer(texto);
        List<String> lista = new ArrayList();
        List<String> listaUnica = new ArrayList();
        List<proyecto> resultado = new ArrayList();
        
        while(tokens.hasMoreTokens()){
            lista.add(tokens.nextToken());
        }
        //Obtiene las palabras clave
        while(!lista.isEmpty()){
            String temp = lista.remove(0);
            if(lista.contains(temp)){
                while(lista.contains(temp))
                    lista.remove(temp);
            }else{
                if(temp.length() > 3)
                    listaUnica.add(temp);
            }
        }
        //Busca los proyectos por las palabras clave
        if(!listaUnica.isEmpty()){
            String query = "select id from proyecto "
                        + "where descripcion like '%"+listaUnica.remove(0)+"%'";
            for(int i = 1; i < listaUnica.size(); i++){
                query += " or descripcion like '%"+listaUnica.get(i) +"%'";
            }
            
            try{
                conexion = DriverManager.getConnection(url,userName,password);
                Statement s = conexion.createStatement();
                s.executeQuery(query);
                ResultSet rs = s.getResultSet();
                rs.beforeFirst();
                while(rs.next()){
                    resultado.add(raiz.buscarProyecto(rs.getInt(1)));
                }
            }catch(Exception e){
                String error = e.getMessage();
                return null;
            }
        } return resultado;
    }
    
    public UserData copiar(String nombre){
        UserData temp = new UserData();
        temp.setTipo(-1);
        try{
            conexion = DriverManager.getConnection(url, userName, password);
            String query = "Select * from usuario where nombre = '"+nombre+"';";
            Statement stat = conexion.createStatement();
            stat.executeQuery(query);
            ResultSet rs = stat.getResultSet();
            rs.next();
            temp.setId(rs.getInt(1));
            temp.setTipo(rs.getInt(5));
            temp.setEmail(rs.getString(4));
            temp.setTelefono(rs.getInt(3));
        }catch(Exception e){
            temp = null;
        }
        return temp;
    }
    
     public void insertarProyecto(proyecto nuevoProyecto){
        try{
            conexion = DriverManager.getConnection(url,userName,password);   
        }catch(Exception e){
        }        
        String query = "Insert INTO proyecto(nombre, descripcion, fechaInicio, fechaFin,idCategoria, idEncargado) VALUES(";
        query += "'"+nuevoProyecto.getNombre()+"','"+nuevoProyecto.getDescripcion()+"','"+nuevoProyecto.getFechaInicio()+"','"+nuevoProyecto.getFechaFinal()+"','"+nuevoProyecto.getPadre().getId()+"',(Select id from usuario where nombre = '"+nuevoProyecto.getNombreEncargado()+"'));";        
        String id = "";
        try{
            Statement stat = conexion.createStatement();
            stat.executeUpdate(query);
            
            
            conexion.close();
        }catch (Exception e){
        
        }     
        
    }
    
    public void borrarProyecto(proyecto victima){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
        }catch(Exception e){
        }
        String query = "DELETE FROM proyecto Where nombre = "+victima.getNombre()+";";
        try{
            Statement stat = conexion.createStatement();
            stat.executeUpdate(query);
            conexion.close();
        }catch (Exception e){            
        }   
    }
    
    public int nuevaSolicitud(proyecto p,int idUsuario,String fecha){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeUpdate("insert into solicitud(idProyecto, idUsuario, fechaSolicitud) "
                    + "values("
                    + p.getId()+","
                    + idUsuario +","
                    + "'"+fecha+"'"+")");
            
            Statement s2 = conexion.createStatement();
            s2.executeQuery("select id from solicitud where idProyecto = "+ p.getId() 
                            + " and "
                            +"idUsuario = "+ idUsuario +"");
            ResultSet rs = s2.getResultSet();
            rs.next();
            int id = rs.getInt(1);
            return id;
        }catch(Exception e){
            String error = e.getMessage();
            return -1;
        }
    }
    
    public ResultSet proyectosSolicitados(int id){
        try{
            conexion = DriverManager.getConnection(url,userName,password);
            Statement s = conexion.createStatement();
            s.executeQuery("select s.id,p.nombre,s.fechaSolicitud,p.descripcion "
                            + "from solicitud s,proyecto p "
                            + "where s.idUsuario = "+id+" and s.idProyecto = p.id");
            ResultSet rs = s.getResultSet();
            return rs;
        }catch(Exception e){
            String error = e.getMessage();
            return null;
        }
    }
}